% Created 2019-01-29 Tue 16:37
\documentclass{article}
                 \usepackage{graphicx}
                 \usepackage{xcolor}
                 \usepackage{xeCJK}
                 \usepackage{fixltx2e}
                 \usepackage{longtable}
                 \usepackage{float}        
                 \usepackage{tikz}         
                 \usepackage{wrapfig}      
                 \usepackage{latexsym,amssymb,amsmath}
                 \usepackage{textcomp}
                 \usepackage{listings}     
                \usepackage{marvosym}     
                \usepackage{textcomp}     
                \usepackage{latexsym}     
                \usepackage{natbib}
                \usepackage{hyperref}
                \usepackage{geometry}
                \setCJKmainfont{黑体}
\author{jacklisp}
\date{\today}
\title{基础训练1:递归}
\hypersetup{
  pdfkeywords={},
  pdfsubject={},
  pdfcreator={Emacs 25.3.1 (Org mode 8.2.10)}}
\begin{document}

\maketitle
\tableofcontents


\section{递归训练(1)}
\label{sec-1}
\subsection{题目1:你的任务是使用递归调用,输出包含5个字符”abcde”的一个全排列,并计算这样的排列有多少种?(每个排列有5个字符,字符可以相同,比如[a a a a a]是一个排列,[a a a a b],是另外一个排列,并且[a a a b a] 与 [a b a a a] 是不同的排列.}
\label{sec-1-1}

答案:\\
\begin{verbatim}
#include <stdio.h>
#include <iostream>
using namespace std;
int sum = 0;//全局变量写在外部
void dg(int temp,char p[])
{
    if(temp == 5)
    {
        //递归出口
        for(int i = 0;i < 5;i++)
        {
            printf("%c ",p[i]);
        }
        printf("\n");
        sum++;    //这棵树到了叶子节点,将数量加1
        return;
    }

    //
    for(char i = 'a';i <= 'e';i++)
    {
            p[temp] = i;
            dg(temp+1,p);
    }
}
\end{verbatim}

\subsection{题目2:使用递归调用,输出包含5个字符”abcde”的一个全排列,并计算这样的排列有多少种?(每个排列有5个字符,字符不能相同.)}
\label{sec-1-2}
答案:\\
\begin{verbatim}
   //判断字符c是否在字符数组中有重复
int same(int len,char c,char p[])
{
    for(int j = 0;j < len;j++)
    if(p[j] == c)
        return 1;

    return 0;
}


void dg2(int temp,char p[])
{
    if(temp == 5)
    {
        //递归出口
        for(int i = 0;i < 5;i++)
        {
            printf("%c ",p[i]);
        }
        printf("\n");
        sum++;
        return;
    }

    for(char i = 'a';i <= 'e';i++)
    {
        //这里需要判断,如果新加入的字符跟原有的字符数组中的字符不同,就不能往下走了
        if(!same(temp,i,p))
        {
            p[temp] = i;
            dg2(temp+1,p);
        }

    }
}
\end{verbatim}

\subsection{题目3:你目前的任务,是使用递归的方法来往方格填写数字.从1\textasciitilde{}9这9个数字中填写到下图的方格,数字不能重复,Xo并要求方格的所有行,所有列和对角元素的和都相等.}
\label{sec-1-3}

\begin{figure}
\centering
\includegraphics[width=0.38\textwidth]{img/task03.png}
\caption{3阶方格}
\end{figure}
% Emacs 25.3.1 (Org mode 8.2.10)
\end{document}